特點
- Async Await 為 Promise 延伸出的特性,是 Promise 的語法糖
- 函式本體是屬於非同步,但內部以 “同步的方式運行非同步” 程式碼
- 更加簡潔處理非同步事件,提高程式碼可讀性
- 使用 try...catch 管理流程,將非同步事件置入於 try 流程內,當遇到錯誤時則在 catch 區塊內接取錯誤訊息
各情況範例
與 Promise 搭配執行
let event = (num) => Math.floor(Math.random() *num)>2 ? true : false
let timer = (num) => Math.floor(Math.random() * num)*1000
let condition = function(something,timer,num) {
return new Promise((resolve,reject)=>{
setTimeout(function(){
if(something) {
resolve('第'+ num +".成功了花了"+timer+'秒');
} else {
reject('第'+ num +'次失敗QQ');
}
},timer)
})
}
//----------------------------只有一個非同步事件的情況----------------------------------
async function example() {
try{
const res1 = await condition(event(5),timer(5),1)
console.log('event1:',res1)
}
catch(err){
console.log('失敗:',err)
}
}
//---------若是兩個事件以上,只要其中一個出現錯誤,即進入catch的階段,並不在繼續往下執行-----------
async function example() {
try{
const res1 = await condition(event(5),timer(5),1)
console.log('event1:',res1)
const res2 = await condition(event(5),timer(5),2)
console.log('event2:',res2)
const res3 = await condition(event(5),timer(5),3)
console.log('event3:',res3)
}
catch(err){
console.log('失敗:',err)
}
}
/*----------與 Promise.all() 搭配,在全部完成後才進行下一步,若事件都成功,則印出陣列回復,若其中rejected,.catch立即回傳第一個完成的失敗回復-----------*/
//-----與 Promise.race() 搭配,其中一事件先完成(不論成功與否),即進入對應的try...catch----------
async function example() {
try{
const res = await Promise.all([condition(event(5),timer(5),1),condition(event(5),timer(5),2),condition(event(5),timer(5),3),condition(event(5),timer(5),4)])
console.log(res)
}
catch(err){
console.log('失敗:',err)
}
}
//----------------------------------------------------------------------------------
example()